package com.hongyi.common.mongoDB.service;

import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;
import java.util.Map;

/**
 * MongoDB API
 */
public interface MongoDBService {

    /**
     * 创建集合
     *
     * @param collectionName 集合名
     */
    boolean createCollection(String collectionName);

    /**
     * 删除集合
     *
     * @param collectionName 集合名
     */
    boolean dropCollection(String collectionName);

    /**
     * 插入一条记录，如已存在则抛出异常
     *
     * @param o 记录
     * @param collectionName 集合名
     */
    boolean insert(Object o, String collectionName);

    /**
     * 插入一条记录，如已存在则抛出异常
     *
     * @param o 记录
     */
    boolean insert(Object o);

    /**
     * 插入多条记录，如已存在则抛出异常
     *
     * @param o 记录
     * @param collectionName 集合名
     */
    boolean insertAll(List o, String collectionName);

    /**
     * 插入多条记录，如已存在则抛出异常
     *
     * @param o 记录
     * @param c 插入的类型
     */
    boolean insertAll(List o, Class c);

    /**
     * 插入一条记录，如已存在则更新
     *
     * @param o 记录
     * @param collectionName 集合名
     */
    void save(Object o, String collectionName);

    /**
     * 查询集合中全部记录
     *
     * @param c 返回的类型
     * @param collectionName 集合名
     */
    Object findAll(Class c, String collectionName);

    /**
     * 根据 id 查询
     *
     * @param id 记录 id
     * @param c 返回的类型
     */
    Object findById(String id, Class c);

    /**
     * 根据 ids 查询
     *
     * @param idName 主键字段名
     * @param ids id 集合
     * @param c 返回的类型
     */
    Object findByIds(String idName, List<String> ids, Class c);

    /**
     * 根据条件查询一条记录
     *
     * @param criteria 条件拼接，如：Criteria.where("name").is("bai")
     * @param c 返回的类型
     * @param collectionName 集合名
     */
    Object findOne(Criteria criteria, Class c, String collectionName);

    /**
     * 根据条件查询记录列表
     *
     * @param criteria 条件拼接
     * @param c 返回的类型
     * @param sorts 需要排序的字段集合
     */
    Object findByCondition(Criteria criteria, Class c, List<Sort> sorts);

    /**
     * 根据条件查询记录列表
     *
     * @param criteria 条件拼接
     * @param c 返回的类型
     * @param collectionName 集合名
     */
    Object findByCondition(Criteria criteria, Class c, String collectionName);

    /**
     * 根据条件查询记录列表
     *
     * @param criteria 条件拼接
     * @param c 返回的类型
     * @param collectionName 集合名
     * @param limit 数量
     */
    Object findByCondition(Criteria criteria, Class c, int limit, String collectionName);

    /**
     * 根据条件查询记录列表
     *
     * @param criteria 条件拼接
     * @param c 返回的类型
     * @param collectionName 集合名
     * @param limit 数量
     * @param sort 排序
     */
    Object findByCondition(Criteria criteria, Class c, int limit, Sort sort, String collectionName);

    /**
     * 根据条件查询记录列表
     *
     * @param criteria 条件拼接
     * @param c 返回的类型
     * @param pageNum 当前页
     * @param pageSize 页大小
     * @param sorts 需要排序的字段集合
     */
    Object findByCondition(Criteria criteria, Class c, Integer pageNum, Integer pageSize, List<Sort> sorts);

    /**
     * 根据条件查询记录列表
     *
     * @param criteria 条件拼接
     * @param c 返回的类型
     * @param collectionName 集合名
     * @param pageNum 当前页
     * @param pageSize 页大小
     * @param sorts 需要排序的字段集合
     */
    Object findByCondition(Criteria criteria, Class c, String collectionName, Integer pageNum, Integer pageSize, List<Sort> sorts);

    /**
     * 分组查询
     *
     * @param criteria 条件拼接
     * @param c 返回的类型
     * @param fields 需要分组的字段
     * @param collectionName 集合名
     * @param pageNum 当前页数
     * @param pageSize 页大小
     */
    Object group(Criteria criteria, Class c, String[] fields, String collectionName, long pageNum, long pageSize);

    /**
     * 分组查询
     *
     * @param criteria 条件拼接
     * @param c 返回的类型
     * @param fields 需要分组的字段
     * @param collectionName 集合名
     */
    Object group(Criteria criteria, Class c, String[] fields, String collectionName);

    /**
     * 返回指定字段
     *
     * @param criteria 条件拼接
     * @param c 返回的类型
     * @param collectionName 集合名
     */
    Object findPropertyByCondition(Criteria criteria, Class c, String collectionName, String[] includes);

    /**
     * 返回满足条件的文档数量
     *
     * @param criteria 条件拼接
     * @param collectionName 集合名
     */
    long count(Criteria criteria, String collectionName);

    /**
     * 返回满足条件的文档数量
     *
     * @param criteria 条件拼接
     * @param c 返回的类型
     */
    long count(Criteria criteria, Class c);

    /**
     * 更新满足条件的第一条文档
     *
     * @param criteria 条件拼接
     * @param update new Update().set("age",20).set("name","bai");
     * @param collectionName 集合名
     */
    Object updateOne(Criteria criteria, Update update, String collectionName);

    /**
     * 更新满足条件的第一条文档
     *
     * @param criteria 条件拼接
     * @param update new Update().set("age",20).set("name","bai");
     * @param c 修改的类型
     */
    Object updateOne(Criteria criteria, Update update, Class c);

    /**
     * 更新所有满足条件的文档
     *
     * @param criteria 条件拼接
     * @param update new Update().set("age",20).set("name","bai");
     * @param collectionName 集合名
     */
    Object updateMany(Criteria criteria, Update update, String collectionName);

    /**
     * 更新所有满足条件的文档
     *
     * @param criteria 条件拼接
     * @param update new Update().set("age",20).set("name","bai");
     * @param c 修改的类型
     */
    Object updateMany(Criteria criteria, Update update, Class c);

    /**
     * 删除满足条件的信息
     *
     * @param criteria 条件拼接
     * @param collectionName 集合名
     */
    Object delete(Criteria criteria, String collectionName);

    /**
     * 删除满足条件的信息
     *
     * @param criteria 条件拼接
     * @param c 删除的类型
     */
    Object delete(Criteria criteria, Class c);
}

